%% 禁忌搜索算法优化Tabu search algorithm
clear,clc
%% 参数初始化
f=@(x)1/12*sum(x.^4)-1/2*sum(x.^2)+sum(abs(x-4));% 目标函数
lb=-1e2*ones(1,6);ub=1e2*ones(1,6);%变量范围
n=length(lb);% 变量个数
%% 禁忌搜索算法计算过程
mn=10;% 计算次数
mn1=1e3;% 迭代次数
t0=6;% 禁忌表长度
r=(ub-lb)/10;% 对于连续型问题，设置领域范围
r1=mean((ub-lb)/1000);% 禁忌范围
tabu=zeros(t0,n);% 禁忌表
k=50;x2=zeros(k,n);f2=zeros(k,1);
result_final=[];
for i=1:mn
    tic
    x1=lb+rand(1,n).*(ub-lb);% 初始解
    f0=f(x1);
    s0=f0;% 最优值
    xbest=x1;% 最优解
    for i1=1:mn1
        for i2=1:k
            t1=0;
            while t1==0
                z=-1+2*rand(1,n);
                xk=x1+z.*r;
                t2=0;
                for i3=1:t0
                    if(sum((xk-tabu(i3,:)).^2)>r1)
                        t2=t2+1;
                    end
                end
                if(t2==t0)
                    t1=1;
                end
            end
            x2(i2,:)=xk;
        end
        for i2=1:k
            f2(i2)=f(x2(i2,:));
        end
        [f3,k1]=sort(f2);
        tabu1=tabu(1:end-1,:);
        tabu=[x2(k1(1),:);tabu1];
        if(f3(1)<s0)
            s0=f3(1);
            xbest=x2(k1(1),:);
        end
        x1=x2(k1(1),:);
        f0=f3(1);
    end
    result_final=[result_final;[s0,xbest]];
    toc
end